/**
 * 主工具开发集合
 */
;(function (win) { // 主开发框架
    win.App = win.App || {}

    App.namespace = function (name, sep) {
        var s = name.split(sep || '.'),
            d = {},
            o = function (a, b, c) {
                if (c < b.length) {
                    if (!a[b[c]]) {
                        a[b[c]] = {}
                    }
                    d = a[b[c]]
                    o(a[b[c]], b, c + 1)
                }
            }

        o(window, s, 0)
        return d
    }

    App.namespace('App.cookie')

    $.extend(App.cookie, {
        set: function (name, value, days) {
            var exp = new Date()

            exp.setTime(exp.getTime() + days * 24 * 60 * 60 * 1000)
            var arr = document.cookie.match(new RegExp('(^| )' + name + '=([^;]*)(;|$)'))
            document.cookie = name + '=' + escape(value) + ';expires=' + exp.toGMTString()
        },
        get: function (name) {
            var arr = document.cookie.match(new RegExp('(^| )' + name + '=([^;]*)(;|$)'))
            if (arr != null) {
                return unescape(arr[2])
            }
            return null
        },
        remove: function (name) {
            var exp = new Date()
            exp.setTime(exp.getTime() - 1)
            var cval = App.cookie.get(name)
            if (cval != null) {
                document.cookie = name + '=' + cval + ';expires=' + exp.toGMTString()
            }
        }
    })

    // loading
    App.loading = {
        _count: 0,
        _create: _.once(function () {
            var tpl = '<div id="app-loading" class="ui-loading">';
            tpl += '<div class="ui-loading-mask"></div>';
            tpl += '<div class="ui-loading-icon"><h3>正在加载....</h3></div>';
            tpl += '</div>';
            $('body').append(tpl);
        }),
        show: function () {
            this._create()
            if (!this._count) {
                $('#app-loading').show()
            }
            this._count++
        },
        hide: function () {
            this._count--
            if (this._count <= 0) {
                this._count = 0
                $('#app-loading').hide()
            }
        }
    }

    var AJAX_DEFAULTS = {
        type: 'get',
        dataType: 'json',
        timeout: 20000,
        beforeSend: function (data, status, xhr) {
            App.loading.show()
        },
        complete: function (xhr, ex) {
            App.loading.hide()
        },
        error: function (xhr, status, ex) {
            // require(['static/js/jym.dialog'], function (d) {
            //     d.message.show('网络不给力，请稍后再试！')
            // })
        }
    }

    // ajax 封装
    App.http = function (setting) {
        var ajaxOptions = $.extend({}, AJAX_DEFAULTS, setting)
        return $.ajax(ajaxOptions)
    }

}(window));


// core
(function (win, $) {
    var userAgent = window.navigator.userAgent

    $.extend(App, {
        version: '0.0.1',
        now: function () {
            return (new Date).getTime()
        },
        isOpera: function () {
            return !!window.opera
        },
        isFirefox: function () {
            return userAgent.indexOf('Firefox') > 0
        },
        isChrome: function () {
            return userAgent.indexOf('Chrome') > 0
        },
        isEmail: function () {
            var reg1 = /^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4})$/
            return reg1.test(this)
        },
        isMobile: function () {
            var reg = /^[1][3,4,5,8]\d{9}$/
            return reg.test(this)
        },
        /**
         * @description 手机类型判断
         * @param type
         * @return {*}
         */
        getBrowserInfo: function (type) {
            var typeObj = {
                android: 'android',
                iphone: 'android',
                ipad: 'ipad',
                weixin: 'micromessenger'
            }
            return type ? userAgent.toLowerCase().indexOf(typeObj[type]) !== -1 : userAgent.toLowerCase();
        },
        /**
         * 将url上的参数组装成以参数名称为属性名的对象
         */
        getParams: function () {
            var url = window.location.href
            var index = url.indexOf('?')
            var params = {}
            if (index !== -1) {
                var paramsStr = url.slice(index + 1) // 获取到问号以后的字符串
                var paramsArr = paramsStr.split('&')
                // 把url上的所有参数塞到json对象中,以键值对的方式保存
                for (var i = 0, length = paramsArr.length, param; i < length; i++) {
                    param = paramsArr[i].split('=')
                    params[param[0]] = param[1]
                }
            }
            return params
        },
        /**
         * @description 获取水平滚动条距离左侧的距离，即文档被拉下的距离. 兼容不同的文档模式
         * @returns {number} 水平滚动条距离顶部的距离
         */
        getScrollLeft: function () {
            return window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft
        },
        /**
         * 获取垂直滚动条距离顶部的距离，即文档被拉下的距离. 兼容不同的文档模式
         * @returns {number}
         */
        getScrollTop: function () {
            return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
        },
        /**
         * 清除字符串开头和结尾的空格
         */
        trim: function (str) {
            return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '')
        },
        /**
         * 清除字符串中所有的空格
         * @returns {*}
         */
        trimAll: function (str) {
            return str.replace(/\s+/g, '')
        },
        /**
         * 检测密码强度
         * @param str '12asdASAD'
         * @returns {number} 3(强度等级为3)
         */
        checkPasswordLevel: function (str) {
            var nowLv = 0
            if (str.length < 6) {
                return nowLv
            }
            if (/[0-9]/.test(str)) {
                nowLv++
            }
            if (/[a-z]/.test(str)) {
                nowLv++
            }
            if (/[A-Z]/.test(str)) {
                nowLv++
            }
            if (/[\.|-|_]/.test(str)) {
                nowLv++
            }
            return nowLv
        },
        /**
         * 随机返回一个范围的数字
         * @param n1 返回5-10的随机整数，包括5，10
         * @param n2
         * @returns {number}
         */
        randomNum: function (n1, n2) {
            return Math.round(n1 + Math.random() * (n2 - n1));
        },
        /**
         * 格式化处理字符串
         * @param str abc
         * @param size 1
         * @param delimiter -
         * @returns {*} a-b-c
         */
        formatText: function (str, size, delimiter) {
            var _size = size || 3, _delimiter = delimiter || ','
            var regText = '\\B(?=(\\w{' + _size + '})+(?!\\w))'
            var reg = new RegExp(regText, 'g')
            return str.replace(reg, _delimiter)
        },
        /**
         * 金额大写转换函数
         * @param n 168752632
         * @returns {string} 人民币壹亿陆仟捌佰柒拾伍万贰仟陆佰叁拾贰元整
         */
        toDigit: function (n) {
            var fraction = ['角', '分', '厘']
            var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
            var unit = [
                ['元', '万', '亿'],
                ['', '拾', '佰', '仟']
            ]
            var head = n < 0 ? '欠人民币' : '人民币'
            n = Math.abs(n)
            var s = ''
            for (var i = 0; i < fraction.length; i++) {
                s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '')
            }
            s = s || '整'
            n = Math.floor(n)
            for (var i = 0; i < unit[0].length && n > 0; i++) {
                var p = ''
                for (var j = 0; j < unit[1].length && n > 0; j++) {
                    p = digit[n % 10] + unit[1][j] + p
                    n = Math.floor(n / 10)
                }
                s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s
                //s = p + unit[0][i] + s;
            }
            return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整')
        },
        /**
         * 剩余时间
         * @param endTime
         * @returns {string} 剩余时间6天 2小时 28 分钟20 秒
         */
        getEndTime: function (endTime) {
            var t = +new Date(endTime) - +new Date() //时间差的毫秒数
            var d = 0,
                h = 0,
                m = 0,
                s = 0

            if (t >= 0) {
                d = Math.floor(t / 1000 / 3600 / 24)
                h = Math.floor(t / 1000 / 60 / 60 % 24)
                m = Math.floor(t / 1000 / 60 % 60)
                s = Math.floor(t / 1000 % 60)
            }
            return { d: d, h: h, m: m, s: s }
        },
        /**
         * @description 时间格式化
         * @param date
         * @param fmt
         * @return {*}
         */
        formatDate: function (date, fmt) {
            fmt = fmt || 'yyyy-MM-dd hh:mm:ss'

            var _date = new Date(date),
                _fmt = fmt,
                o = {
                    'M+': _date.getMonth() + 1,
                    'd+': _date.getDate(),
                    'h+': _date.getHours(),
                    'm+': _date.getMinutes(),
                    's+': _date.getSeconds()
                }
            if (/(y+)/.test(_fmt)) {
                _fmt = _fmt.replace(RegExp.$1, (_date.getFullYear() + '').substr(4 - RegExp.$1.length))
            }
            for (let k in o) {
                if (new RegExp('(' + k + ')').test(_fmt)) {
                    _fmt = _fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
                }
            }
            return _fmt
        }
    })

}(window, jQuery));

// ui
(function (win, $) {
    $.extend(App, {
        toast: function (msg, callback) {
            // alert(msg)
            callback && callback()
        }
    })

}(window, jQuery))

$(function () {
    // todo
})
